package com.incar.chuxing.utils;

/**
 * Created by Michael on 11/2.
 */

public class HexUtil {





    private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',

            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };





    private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',

            '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };





    public static char[] encodeHex(byte[] data) {

        return encodeHex(data, true);

    }





    public static char[] encodeHex(byte[] data, boolean toLowerCase) {

        return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);

    }





    protected static char[] encodeHex(byte[] data, char[] toDigits) {

        if(data == null)

            return null;

        int l = data.length;

        char[] out = new char[l << 1];

        for (int i = 0, j = 0; i < l; i++) {

            out[j++] = toDigits[(0xF0 & data[i]) >>> 4];

            out[j++] = toDigits[0x0F & data[i]];

        }

        return out;

    }





    public static String encodeHexStr(byte[] data) {

        return encodeHexStr(data, true);

    }





    public static String encodeHexStr(byte[] data, boolean toLowerCase) {

        return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);

    }





    protected static String encodeHexStr(byte[] data, char[] toDigits) {

        return new String(encodeHex(data, toDigits));

    }





    public static byte[] decodeHex(char[] data) {



        int len = data.length;



        if ((len & 0x01) != 0) {

            throw new RuntimeException("Odd number of characters.");

        }



        byte[] out = new byte[len >> 1];



        // two characters form the hex value.

        for (int i = 0, j = 0; j < len; i++) {

            int f = toDigit(data[j], j) << 4;

            j++;

            f = f | toDigit(data[j], j);

            j++;

            out[i] = (byte) (f & 0xFF);

        }



        return out;

    }





    protected static int toDigit(char ch, int index) {

        int digit = Character.digit(ch, 16);

        if (digit == -1) {

            throw new RuntimeException("Illegal hexadecimal character " + ch

                    + " at index " + index);

        }

        return digit;

    }





    public static byte[] hexStringToBytes(String hexString) {

        if (hexString == null || hexString.equals("")) {

            return null;

        }

        hexString = hexString.toUpperCase();

        int length = hexString.length() / 2;

        char[] hexChars = hexString.toCharArray();

        byte[] d = new byte[length];

        for (int i = 0; i < length; i++) {

            int pos = i * 2;

            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

        }

        return d;

    }



    public static byte charToByte(char c) {

        return (byte) "0123456789ABCDEF".indexOf(c);

    }



    public static String extractData(byte[] data, int position) {

        return HexUtil.encodeHexStr(new byte[]{data[position]});

    }
}
